#include<vector>
#include<iostream>
using namespace std;
namespace Mango
{
template<size_t N> //非类型模板参数
class bitset
{
public:
  bitset()
  {
    _bits.resize(N/8 + 1,0); 
  }
  ~bitset()
  {}
  void set(size_t pos)
  {
    int i = pos/8;
    int j = pos%8;
    _bits[i] |= (1<<j);
  }
  void reset(size_t pos)
  {
    int i = pos / 8 ;
    int j = pos % 8 ;
    _bits[i] &= ~(1<<j);
  }
  void flip(size_t pos)
  {
    int i = pos / 8 ;
    int j = pos % 8 ;
    _bits[i] ^= (1<<j);
  }
  bool test(size_t pos)
  {
    int i = pos / 8;
    int j = pos % 8;
    return _bits[i]&(1<<j);
  }
  size_t size()
  {
    return N;
  }
  size_t count() //被设置的位数
  {
    size_t ans = 0;
    for(auto x:_bits)
    {
      while(x)
      {
        x&=(x-1);
        ans++;
      }
    }
    return ans;
  }
  bool any() //是否有位被设置
  {
    for(auto& x: _bits)
    {
      if(x!=0)
        return true;
    }
    return false;
  }
  bool none() //全部位都没有被设置
  {
    return !any();
  }
  bool all() //是否所有位都被设置
  {
    //检查前n-1个数
    int n = _bits.size();
    //方法1:检查前n-1个数的每个数的8位比特位是否都是1
    for(int i = 0;i<n-1;i++)
    {
      for(int j = 0;j<8;j++)
      {
        if( (_bits[i]&(1<<j)) == 0)
        {
          return false;
        }
      }
    }
    //for(int i = 0;i<n-1;i++)
    //{
    //  if(~_bits[i] !=0) //全1序列取反,结果为0,如果不是0,就说明不是全部位都被设置
    //    return false;
    //}
    //检查最后一个数的前N%8位
    for(int i =0;i<N%8;i++)
    {
      if( (_bits[i] &(1<<i)) == 0 )
      {
           return false;
      }
    }
    return true;
  }
  void Print()
  {
    cout <<"------------打印开始--------------"<<endl;
    size_t n = _bits.size();
    size_t count = 0;//统计被设置的位的个数
    size_t all =0;// 一共有多少位
    for(int i = 0;i<n-1;i++)
    {
      for(int j = 0;j < 8;j++)
      {
        all++;
        if( (_bits[i]&(1<<j)) != 0 )
        {
          count++;
          cout << "1";
        }
        else 
          cout << "0";
      }
    }
    for(int i = 0;i<N%8;i++)
    {
      if( (_bits[i]&(1<<i)) != 0 )
      {
        count ++;
        cout <<"1";
      }
      else 
      {
        cout <<"0";
      }
    }
    cout << endl;
    cout <<"------------打印结束--------------"<<endl;
  }
private:
  vector<char> _bits;
};

}